<?
/* Se asegura que el archivo es incluido por el index */
	defined( 'LOAD_MODULE_ACTION' ) or die( 'No esta permitido el acceso directo a ' . __FILE__ );
	/* Cuando se hace el include del archivo automaticamente crea un objeto y lo guarda en una variable temporal */
		$this->oTmpObject = new Accion_exe( $this );

class Accion_exe extends Exe
	{
	function Accion_exe( &$oModule )
		{
			$this->oModule = &$oModule;
			// Valida que el Entorno sea el Parametrico
				if ( ES_PARAMETRICO == false )
				{
					addMessage('Esta accion solo puede hacerse en el entorno parametrico');
					$this->oModule->back();
				}
			$this->oDatabase = openMetadataDB ( getParam('cPathModule') );
		}
	function changeModule()
		{
			$oForm = $this->oModule->loadClass( 'copiar_modulo_frm' );
			extract( $oForm->getFieldArray() );
			$aAcciones = explode ( ',', $ncAccion);
			foreach( $aAcciones  as $ncAccion )
			{
				$aClases = $this->oDatabase->getArray("SELECT DISTINCT ACl.ncClase FROM stAccionClase as ACl JOIN stClase As Cla ON ACl.ncClase = Cla.ncClase   JOIN stAccion AS Act ON ACl.ncAccion = Act.ncAccion WHERE ACl.ncAccion = $ncAccion AND Cla.ncSubmodulo = Act.ncSubmodulo");				
				foreach( $aClases as $ncClase )
					$this->oDatabase->update("stClase", "ncSubModulo", $ncSubModulo, 'WHERE',  "ncClase", $ncClase);
				
				$this->oDatabase->update("stAccion", "ncSubModulo", $ncSubModulo,'WHERE', "ncAccion", $ncAccion );
			}
		}
	function duplicate()
		{
			/// Convierte a variables los datos del Formulario asociado a la accion
			$oForm = $this->oModule->loadClass( 'accion_frm' );
			/// Copia la accion
			$aAccion = $this->oDatabase->getArray("SELECT * FROM stAccion WHERE ncAccion = " . $_POST['ncAccion'] );
			$ncAccionNew = $this->oDatabase->nextKey("stAccion", "ncAccion" );
			$this->oDatabase->insert("stAccion"
									, "ncModo", $aAccion['ncModo']
									, "ncTipoAccion", $aAccion['ncTipoAccion']
									, "cObjetivo", $aAccion['cObjetivo']
									, "cNombre", $aAccion['cNombre']
									, "cIcono", $aAccion['cIcono']
									, "cParametro", $aAccion['cParametro']
									, "cdAccion", $_POST['cdAccion']
									, "ncSubModulo", $_POST['ncSubModulo']
									, "ncAccion", $ncAccionNew  );
			/// Copia la secuencia de la accion
			$oRs = $this->oDatabase->recordset( "SELECT * FROM stAccionClase WHERE ncAccion = " . $_POST['ncAccion']  . " ORDER BY ncOrden" );
			for( $nIndex = 0; $oRs->moveNext(); $nIndex++ )
			{
				// Da de alta la secuencia
				$this->oDatabase->insert("stAccionClase"
								, "ncEvento", $oRs->aFields['ncEvento']
								, "cMetodo", $oRs->aFields['cMetodo']
								, "nPaso", $oRs->aFields['nPaso']
								, "ncOrden", $oRs->aFields['ncOrden']
								, "cParametro", $oRs->aFields['cParametro']
								, "ncClase", $_POST['ncClase_' . $oRs->aFields['ncOrden']]
								, "ncAccion", $ncAccionNew  );
			}
			/// Copia los permisos
			if ( $_POST['ncAccionPermiso'] )
			{
				$oRs = $this->oDatabase->recordset( "SELECT * FROM stPermiso WHERE ncAccion = " . $_POST['ncAccionPermiso'] );
				while( $oRs->moveNext()  )
				{
					$this->oDatabase->insert("stPermiso"
									, "ncActor", $oRs->aFields['ncActor']
									, "ncAccion", $ncAccionNew  );
				}
			}
		}
	function copy()
		{
			/// Convierte a variables los datos del Formulario asociado a la accion
			$oForm = $this->oModule->loadClass( 'copiar_modulo_frm' );
			extract( $oForm->getFieldArray() );
			$aAcciones = explode ( ',', $ncAccion);
			foreach( $aAcciones  as $ncAccion )
			{
				/// Conecta al nuevo modulo
				$oDatabaseNew = openMetadataDB ( $cPathModuleNuevo );
				/// Copia la accion
				$aAccion = $this->oDatabase->getArray("SELECT * FROM stAccion WHERE ncAccion = $ncAccion" );
				$ncAccionNew = $oDatabaseNew->getData("SELECT ncAccion FROM stAccion WHERE cdAccion = '" . $aAccion['cdAccion'] . "'");
				if ( $ncAccionNew  != '' )
				{
					addMessage("La accion " . $aAccion['cdAccion'] . " ya existe en el modulo $cPathModuleNuevo !");
					return false;
				}
				$ncAccionNew = $oDatabaseNew->nextKey("stAccion", "ncAccion" );
				$oDatabaseNew->insert("stAccion"
										, "ncModo", $aAccion['ncModo']
										, "ncTipoAccion", $aAccion['ncTipoAccion']
										, "cObjetivo", $aAccion['cObjetivo']
										, "cNombre", $aAccion['cNombre']
										, "cIcono", $aAccion['cIcono']
										, "cParametro", $aAccion['cParametro']
										, "cdAccion", $aAccion['cdAccion']
										, "ncSubModulo", $ncSubModulo
										, "ncAccion", $ncAccionNew  );
				/// Copia la secuencia de la accion
				$oRs = $this->oDatabase->recordset( "SELECT * FROM stAccionClase WHERE ncAccion = $ncAccion" );
				while ( $oRs->moveNext() )
				{
					$aClase = $this->oDatabase->getArray( "SELECT * FROM stClase WHERE ncClase = " . $oRs->aFields['ncClase'] );
					$ncClase = $oDatabaseNew->getData("SELECT ncClase FROM stClase WHERE cFisico = '" . $aClase['cFisico'] . "'");
					// Si no existe la Clase => la da de alta
					if ( $ncClase == '' )
					{
						list ( $nDesde, $nHasta )= $this->oDatabase->getArray("select nDesde, nHasta FROM stSubModulo Where ncSubModulo = $ncSubModulo" );
						$nDesde += 1000; $nHasta += 1000;
						$ncClase = $oDatabaseNew->nextKey("stClase", "ncClase", " ncClase between $nDesde and $nHasta " );
						if ( $ncClase < $nDesde ) $ncClase  = $nDesde;
						$oDatabaseNew->insert("stClase"
									, "ncSubModulo", $ncSubModulo
									, "cArchivo", $aClase['cArchivo']
									, "cDirectorio", $aClase['cDirectorio']
									, "cDescripcion", $aClase['cDescripcion']
									, "ncEstadoClase", 1
									, "ncTipoClase", $aClase['ncTipoClase']
									, "cFisico", $aClase['cFisico']
									, "cdClase", $aClase['cdClase']
									, "ncClase", $ncClase  );
					}
					// Da de alta la secuencia
					$oDatabaseNew->insert("stAccionClase"
									, "ncEvento", $oRs->aFields['ncEvento']
									, "cMetodo", $oRs->aFields['cMetodo']
									, "nPaso", $oRs->aFields['nPaso']
									, "ncOrden", $oRs->aFields['ncOrden']
									, "cParametro", $oRs->aFields['cParametro']
									, "ncClase", $ncClase
									, "ncAccion", $ncAccionNew  );
				}
			}
		}
	// MODIFICAR_ACCION:
	function update()
		{
			// Convierte a variables los datos del Formulario asociado a la accion
			$oForm = $this->oModule->loadClass( 'accion_frm' );
			extract( $oForm->getFieldArray() );
			// Modifica el Registro
			$this->oDatabase->update("stAccion", "ncModo", $ncModo, "ncTipoAccion", $ncTipoAccion,"cObjetivo", $cObjetivo
								, "cNombre", $cNombre, "cIcono", $cIcono, "cParametro", $cParametro, "cdAccion", $cdAccion, "ncSubModulo", $ncSubModulo
								, "WHERE", "ncAccion", $ncAccion );
			$oForm->reset();
		}
	// AGREGAR_ACCION:
	function insert()
		{
			// Convierte a variables los datos del Formulario asociado a la accion
			$oForm = $this->oModule->loadClass( 'accion_frm' );
			extract( $oForm->getFieldArray() );
			if ( $cNombre == '' ) $cNombre = $cdAccion;
			// Busca la proxima clave
			$ncAccion = $this->oDatabase->nextKey("stAccion", "ncAccion" );
			//Agrega el registro
			$this->oDatabase->insert("stAccion"
								, "ncModo", $ncModo
								, "ncTipoAccion", $ncTipoAccion
								,"cObjetivo", $cObjetivo
								, "cNombre", $cNombre
								, "cIcono", $cIcono
								, "cParametro", $cParametro
								, "cdAccion", $cdAccion
								, "ncSubModulo", $ncSubModulo
								, "ncAccion", $ncAccion );
			$oForm->reset();
			// Redirecciona la siguiente accion
			$this->oModule->setRedirect( CONSULTAR_CLASES_DE_UN_ACCION, "ncAccion=$ncAccion" );
		}
	// ELIMINAR_ACCION:
	function delete()
		{
			// Obtiene los parametros
			$oncAccion      = new InputNumber('', 'ncAccion');
			$aAcciones     = $oncAccion->getValueAsArray();
			foreach( $aAcciones  as $ncAccion )
			{
				// Elimina los permisos de la accion
				$this->oDatabase->delete("stPermiso", "ncAccion", $ncAccion);
				// Elimina las clases de la accion
				$this->oDatabase->delete("stAccionClase", "ncAccion", $ncAccion );
				// Elimina la accion
				$this->oDatabase->delete("stAccion", "ncAccion", $ncAccion );
			}
		}
	}
?>